<?php
/**
 * Description : elasticsearch基类
 * @filename   : ElasticsearchBase.php
 * @author     : liuqingwei
 * @date       : 2019-08-07
 *
 * @Copyright (c) 2015 liuqingwei
 *
 * vim set ts=4
 */


namespace helpers\Elasticsearch;


class ElasticsearchBase
{
    public $es;
    
    /**
     * 初始化
     */
    public function __construct($config = array())
    {
       $this->es = ElasticsearchConnect::getInstance($config);
    }
   
   /**
    * 基于字段的全文检索查询(支持分页)
    *
    * @param string $index      索引
    * @param string $type       类型
    * @param string $field      字段
    * @param string $value      字段的值
    * @param int    $page       页码
    * @param int    $page_size  页数
    *
    * @return json
    */
   public function matchSearchByField($index,$type,$field,$value,$page=0,$page_size=50)
   {
       $param = [
           'index' => $index,
           'type'  => $type,
           'body'  => [
               'query' => [
                   'match' => [
                       $field => $value,
                   ],
               ],
               'from' => $page,
               'size' => $page_size,
           ],
       ];
       $res = $this->es->search($param);
       return $res;
   }
    
    /**
     * 基于id的搜索
     *
     * @param string $index 索引
     * @param string $type  类型
     * @param string $id    默认不指定为字符串，可以自己指定
     *
     * @return mixed
     */
    public function searchById($index,$type,$id)
    {
        $param = [
            'index' => $index,
            'type'  => $type,
            'id'    => $id,
        ];
        
        $res = $this->es->get($param);
        return $res;
    }

    /**
     * 单条添加Es
     *
     * @param string $index 索引
     * @param string $type  文档类型
     * @param string $id    id
     * @param array  $data  索引数据 ['索引字段'=>值]
     *
     * @return mixed
     */
    public function addElasticsearch($index,$type,$id = '',$data)
    {
        $params['index'] = $index;
        $params['type']  = $type;
        if (!empty($id))
        {
            $params['id'] = $id;
        }
        
        $params['body']  = $data;
        $res = $this->es->index($params);
        return $res;
    }
    
    /**
     * 更新Elasticsearch记录指定字段的值
     *
     * @param string $index 索引名称
     * @param string $type  文档类型
     * @param string $id    记录的id
     * @param string $field 字段
     * @param string $value 字段的值
     *
     * @return mixed
     */
    public function updateEs($index,$type,$id,$field,$value)
    {
        $params = [
            'index' => $index,
            'type'  => $type,
            'id'    => $id,
            'body'  => [
                'doc' => [
                    $field=> $value,
                ]
            ]
        ];
        
        $res = $this->es->update($params);
        
        return $res;
    }
    
    /**
     * 删除Elasticsearch文档(索引里的指定记录)
     *
     * @param string $index 索引
     * @param string $type  类型（文档）
     * @param string $id    记录唯一的值(默认和自定义一般指主键id)
     *
     * @return mixed
     */
    public function deteleElasticsearchDoc($index,$type,$id)
    {
        $params = [
            'index' => $index,
            'type'  => $type,
            'id'    => $id
        ];
        
        $res = $this->es->delete($params);
        return $res;
    }
}